/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tesis2.pucp.Maestros.Grasp;

import com.tesis2.pucp.Modelo.TesisAlmacen;
import com.tesis2.pucp.Modelo.TesisPedido;
import java.util.ArrayList;
import java.util.Random;

/**
 *
 * @author pachon
 */
public class Grasp {
    public static TesisPedido Origen;
    public static ArrayList<TesisPedido> listaPedidos;
    public final static float FACTOR = 0.01f;
    public final static float ALPHA = 0.3f;
    
    public static int calcularCantidad(){
        return 1000;
    }
    
    public static RCL getRCL(TesisPedido pedidoActual, ArrayList<TesisPedido> listaClientesRCL){
        RCL rcl =  new RCL();
         
        for(TesisPedido cliente : listaClientesRCL){
            rcl.add(cliente);
        }
        
        rcl.ordenarSegunCriterio(pedidoActual);
        if (rcl.size()!=0){
            rcl.discriminar(ALPHA, pedidoActual);
        }
        return rcl;
    }
    
    private static RutaGrasp compararRutas(RutaGrasp rutaOptima, RutaGrasp rutaConstruccion) {
        if (rutaConstruccion == null){
            return rutaOptima;
        }
        
        if (rutaOptima == null){
            return rutaConstruccion;
        }
        
        if (rutaConstruccion.getTiempo() < rutaOptima.getTiempo()){
            return rutaConstruccion;
        }
        else {
            return rutaOptima;
        }
    }
    
    public ArrayList<TesisPedido> Grasp(ArrayList<TesisPedido> listaClientes, TesisAlmacen almacen){
        
        ArrayList<TesisPedido> lista = new ArrayList<>();
        RutaGrasp rutaOptima = null;        
        int iteraciones = calcularCantidad();
        
        for(int i = 0; i<iteraciones; i++){
            
            RutaGrasp rutaConstruccion = new RutaGrasp();
            rutaConstruccion.setTiempo(0);
            TesisPedido cliente = new TesisPedido();
            cliente.setLatitud(almacen.getLatitud());
            cliente.setLongitud(almacen.getLongitud());
            TesisPedido auxiliar = new TesisPedido();
            lista = listaClientes;
            int tamaño = lista.size();
            
            RCL rcl;
            
            for(int j = 0; j<tamaño; j++){
                rcl = getRCL(cliente, lista);
                if (rcl.size()!=0){
                    Random rand = new Random();
                    int random = rand.nextInt(rcl.size());
                    auxiliar = rcl.get(random);
                    int size = lista.size();
                    int val=0;
                    for (int k = 0; k<size;k++){
                        if(lista.get(k).getIdpedido() == cliente.getIdpedido()){
                            val = k;
                        }
                    }
                    lista.remove(val);
                    rutaConstruccion.add(cliente);
                    rutaConstruccion.setTiempo(calculaTiempo(cliente, auxiliar));
                    cliente = auxiliar;
                    
                }
            }
            
            rutaOptima = compararRutas(rutaOptima, rutaConstruccion);
        }
        
        lista = new ArrayList<>();
        
        for (TesisPedido c:rutaOptima){
            lista.add(c);
        }
        
        return lista;
    }

    private long calculaTiempo(TesisPedido cliente, TesisPedido auxiliar) {
        long tiempo=0;
        
        return tiempo;
    }
}
